public class MinOperations {
  public int minOperations(int[] nums) { int ans = 0;
    int top = -1; // 栈顶下标（把 nums 当作栈）
    for (int x : nums) {
        while (top >= 0 && x < nums[top]) {
            top--; // 出栈
            ans++;
        }
        // 如果 x 与栈顶相同，那么 x 与栈顶可以在同一次操作中都变成 0，x 无需入栈
        if (top < 0 || x != nums[top]) {
            nums[++top] = x; // 入栈
        }
    }
    return ans + top + (nums[0] > 0 ? 1 : 0);
  }
  public static void main(String[] args) { 
    int[] nums = {1, 2, 3};
    MinOperations obj = new MinOperations();
    int result = obj.minOperations(nums);
    System.out.println(result);
  }

}
    
//   给你一个大小为 n 的 非负 整数数组 nums 。你的任务是对该数组执行若干次（可能为 0 次）操作，使得 所有 元素都变为 0。

// 在一次操作中，你可以选择一个子数组 [i, j]（其中 0 <= i <= j < n），将该子数组中所有 最小的非负整数 的设为 0。

// 返回使整个数组变为 0 所需的最少操作次数。

// 一个 子数组 是数组中的一段连续元素。


// class Solution {
//     public int minOperations(int[] nums) {
//         int ans = 0;
//         int top = -1; // 栈顶下标（把 nums 当作栈）
//         for (int x : nums) {
//             while (top >= 0 && x < nums[top]) {
//                 top--; // 出栈
//                 ans++;
//             }
//             // 如果 x 与栈顶相同，那么 x 与栈顶可以在同一次操作中都变成 0，x 无需入栈
//             if (top < 0 || x != nums[top]) {
//                 nums[++top] = x; // 入栈
//             }
//         }
//         return ans + top + (nums[0] > 0 ? 1 : 0);
//     }
// }

